package dao;

import dto.EspecialidadDTO;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

/**
 *
 * @author lucifer
 */
public class EspecialidadDAO {

  public static final String Tab =
    "create table especialidad (" +
    "id serial," + //pk
    "nombre text" +
    ");" +

    "alter table especialidad add constraint especialidad_pk primary key (id);"
  ;

  public static final String Tuples = "";
    /*
    "insert into especialidad (nombre) values" +
    "('Médico Clínico')," +
    "('Cardiólogo')," +
    "('Homeópata')," +
    "('Psiquiatra')," +
    "('Osteópata')," +
    "('Traumatólogo')," +
    "('Dermatólogo');"
  ;
    */

  private static EspecialidadDAO dao = null;
  private final Connection c;

  public static EspecialidadDAO createDAO() throws SQLException  {
    if (dao == null) {
      dao = new EspecialidadDAO();
    }
    return dao;
  }

  private EspecialidadDAO() throws SQLException {
    c = DB.PQ().Conn();
  }

  public int LastID() throws SQLException {
    return DB.PQ().LastIDFrom("especialidad");
  }

  public ArrayList<EspecialidadDTO> All() throws SQLException {
    return getEspecialidadDTOs("select * from especialidad order by nombre;");
  }

  public ArrayList<EspecialidadDTO> SearchByNombre(String s) throws SQLException {
    return getEspecialidadDTOs(queryByNombre(s));
  }

  private String queryByNombre(String name) throws SQLException {
    String query = String.format(
      "select * from especialidad where nombre ~* '%s' order by nombre;", name
    );
    return query;
  }

  private ArrayList<EspecialidadDTO> getEspecialidadDTOs(String query) throws SQLException {
    Statement s = c.createStatement();
    ResultSet r = s.executeQuery(query);
    ArrayList<EspecialidadDTO> dtos = new ArrayList<>();
    while (r.next()) {
      dtos.add(
        new EspecialidadDTO(
          r.getInt("id"),
          r.getString("nombre")
        )
      );
    }
    r.close();
    s.close();
    return dtos;
  }

  public EspecialidadDTO EspecialidadDTO(int id) throws SQLException {
    Statement s = c.createStatement();
    ResultSet r = s.executeQuery(
      "select * from especialidad where id = " + id
    );
    EspecialidadDTO dto = null;
    if (r.next()) {
      dto = new EspecialidadDTO(
        r.getInt("id"),
        r.getString("nombre")
      );
    }
    r.close();
    s.close();
    return dto; //si no existe devuelve null
  }

  // Guarda una **nueva** especialidad.
  public int Save(EspecialidadDTO e) throws SQLException {
    String query = String.format(
      "insert into especialidad values (default, '%s');",
      e.getNombre()
    );
    Statement s = c.createStatement();
    s.executeUpdate(query);
    s.close();
    return LastID();
  }

  public void Delete(int id) throws SQLException {
    Statement s = c.createStatement();
    s.executeUpdate("delete from especialidad where id = " + id);
    s.close();
  }

  public EspecialidadDTO EditString(int id, String attr, String str) throws SQLException {
    String query = String.format(
      "update especialidad set %s = '%s' where id = %d;",
      attr, str, id
    );
    Statement s = c.createStatement();
    s.executeUpdate(query);
    s.close();
    return EspecialidadDTO(id);
  }

}
